#pragma once
//#include "W5500_Driver.h"
//#include "main.h"
#include "Includes.h"

#pragma region //===============枚举================
//设备id码
#define T72_DRIVER		(80)
#define T72_COMBAT		(T72_DRIVER+1)
//enum _device_id
//{
//	MIXED_BLOOD = 64, // 混血儿
//	CORNET, // 短号
//};

//帧类型
enum _frame_type
{
	SYNC	= 0x55,
	LINK_Fr = 0x88,	//连接帧
	LINK_AFFIRM_Fr,	//连接确认帧
	STATUS_Fr,		//状态帧
	INDICAT_Fr,		//指示帧
	UP_CONFIG_Fr,	//上行硬件配置帧
	DN_CONFIG_Fr,	//下行硬件配置帧
	GET_CONFIG_Fr,	//获得硬件配置命令帧--无参数
	SAVE_CONFIG_Fr,	//保存硬件配置帧
	SET_ANALOG_TAP_Fr,   //设置模拟量和档位量命令帧--参数:analog_tap_pos偏移量
	RESET_Fr,       //复位命令帧--无参数
    CAL_NONL_R_Fr,  //校准非线性帧--参数:cal_pct[]和cal_out的索引,参数1:百分比
};
#pragma endregion

#pragma region //===============通信协议================
#pragma pack(1)
//连接帧--开机后一直向上发送直到收到下行确认帧
typedef struct
{
	uint8_t sync; //同步头0x55
	uint8_t frame_type; //帧类型
	uint8_t device_id; //设备id码
	uint8_t link_no; //连接序列号:0(最低层,没有下连信号),1(收到低层信号0之后),2...7
	uint8_t check_sum; //除同步头外其余所有字节和取低8位
}link_t;
//typedef struct
//{
//	uint8_t sync; //同步头0x55
//	uint8_t frame_type; //帧类型
//	uint8_t device_id; //设备id码
//	uint8_t link_no; //连接序列号:0(最低层,没有下连信号),1(收到低层信号0之后),2...7
//	uint8_t check_sum; //除同步头外其余所有字节和取低8位
//}link_affirm_t;合并到link_t
//状态帧
typedef struct
{	//有变化传送,无变化不传.最小间隔40ms
	uint8_t sync; //同步头0x55
	uint8_t frame_type; //帧类型=0x56
	uint8_t device_id; //设备id码
	uint8_t analog_code; //模拟量编码:0--元码,1--规格化后编码
	uint16_t analogs[8]; //模拟量
	uint8_t tap_positions[4]; //开关档位
	uint8_t keys[4]; //每一位代表一个按键状态:0代表松开,1代表按下
	uint8_t check_sum; //除同步头外其余所有字节和取低8位
}status_frame_t;
//指示帧
typedef struct
{	//有变化传送,无变化不传.最小间隔40ms
	uint8_t sync; //同步头0x55
	uint8_t frame_type; //帧类型=0x56
	uint8_t device_id; //设备id码
	uint8_t analog_code; //模拟量编码:0--元码,1--规格化后编码
	uint16_t analogs[12]; //模拟量
	uint8_t leds[4]; //每一位代表一个LED显示状态:0代表灭,1代表亮
	uint8_t check_sum; //除同步头外其余所有字节和取低8位
}indicate_frame_t;
//配置帧--移到W5500_Driver.h中定义!!!
//typedef struct
//{
//	uint8_t sync; //同步头0x55
//	uint8_t frame_type; //帧类型
//	uint8_t link_no; //连接识别码:0(最低层,没有下连信号),1(收到低层信号0之后),2...7
//	uint8_t eeprom_var[6+4*4+10+8+10+(4+4+10+9)*2]; //配置内容
////	EEPROM_MSG_STR eeprom_var;
//	uint8_t check_sum; //除同步头外其余所有字节和取低8位
//}config_t;
//命令帧
typedef struct
{
	uint8_t sync; //同步头0x55
	uint8_t frame_type; //帧类型
	uint8_t link_no; //连接识别码--目标板
	uint8_t para; //命令可能携带的参数:见帧类型枚举说明
	uint16_t para1; //携带参数:见帧类型枚举说明
	uint8_t check_sum; //除同步头外其余所有字节和取低8位
}command_frame_t;
#pragma pack()

typedef struct
{
	uint32_t isLink		: 1; //连接关系已经配置完毕
	uint32_t isTop		: 1; //连接关系已经是最顶(外)层--udp网络接口板
	uint32_t isFr2Tx	: 1; //有1帧要向上发送
}SysState_t;

#pragma endregion


